package com.android.jogomemoria;

import java.util.ArrayList;
import java.util.List;
import java.util.Vector;

import android.content.Context;
import android.content.ContextWrapper;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;

public class RepositorioJogo {


	public static final String BANCO = "jogo_memoria";
	public static RepositorioJogo instancia;
	private SQLiteDatabase bd = null;
	private ContextWrapper context;
	private String tblJogo ="CREATE TABLE IF NOT EXISTS jogo (id_jogo INTEGER  PRIMARY KEY AUTOINCREMENT , tempo int(5), dificuldade int(1), jogador varchar2(30),status varchar2(10));";
	private String tblImagem ="CREATE TABLE IF NOT EXISTS imagem (id_imagem INTEGER PRIMARY KEY AUTOINCREMENT, id_recurso INTEGER, id_jogo INTEGER,aberta varchar2(5) );";
	private String tblRank = "CREATE TABLE IF NOT EXISTS rank (id_jogo INTEGER  PRIMARY KEY AUTOINCREMENT , tempo int(5), pontos int(2), dificuldade int(1), totalpontuacao int(2), erros int(2), bonus int(2), jogador varchar2(30));";
	
	public RepositorioJogo (ContextWrapper wrapper){
		this.context=wrapper;
		this.bd = this.context.openOrCreateDatabase(RepositorioJogo.BANCO, Context.MODE_PRIVATE, null);
		try{
			this.bd.execSQL(this.tblJogo);
			this.bd.execSQL(this.tblImagem);
			this.bd.execSQL(this.tblRank);
		}
		catch (Exception e) {
		}
		finally{
			this.bd.close();
		}
	}
	
	public Boolean salvarRank(Jogo jogo)
	{
		Boolean sucesso = false;
		try
		{
			this.bd = this.context.openOrCreateDatabase(RepositorioJogo.BANCO, Context.MODE_PRIVATE, null);
			String sql= "INSERT INTO rank(jogador, dificuldade, tempo, totalpontuacao, erros, bonus, pontos)"+
			"VALUES('"+jogo.getJogador()+"','"+jogo.getDificuldade()+"','"+jogo.getTempo()+"','"+jogo.getTotalPontos()+"','"+ jogo.getErros()+"','"+ jogo.getBonus()+"','"+ jogo.getPontos()+"');";
			
			this.bd.execSQL(sql);
			sucesso = true;
		}
		catch(Exception ex)
		{
			Log.e("Erro", ex.getMessage());
			sucesso = false;
		}
		finally
		{
			this.bd.close();
		}
		return sucesso;
	}
	
	public List<String> listarTodosJogos()
	{
		this.bd = this.context.openOrCreateDatabase(RepositorioJogo.BANCO, Context.MODE_PRIVATE, null);
		Cursor cursor;
		cursor = this.bd.query("Rank", new String[] {"jogador", "dificuldade", "tempo", "totalpontuacao", "erros", "bonus", "pontos"}, null, null, null, null, "totalpontuacao desc");
		int i = 0;
		List<String> jogos = new ArrayList<String>();
		//String sql = "Select id_jogo, jogador, dificuldade, tempo, totalpontuacao, erros, bonus, pontos From rank;";
		try
		{
			if(cursor.moveToFirst()){
				do{
					if(cursor != null)
					{
						if(i < 10)
						{
							//Verifica a dificuldade escolhida e converte em String
							String dificuldade = "";
							switch (cursor.getInt(1)) {
							case 1:
								dificuldade = "Fácil";
								break;
							case 2:
								dificuldade = "Normal";
								break;
							case 3:
								dificuldade = "Difícil";
								break;
							default:
								break;
							}
							//L� todos os valores do cursor e joga no array de strings
							String s= "             Pontuação\n "+ "\n Jogador: "+ cursor.getString(0)+"\n Dificuldade: "
							+ dificuldade +"\n Pontos: "+cursor.getInt(6)+"\n Erros: "+cursor.getInt(4)+
							  "\n Tempo:"+cursor.getInt(2)+"\n Total: "+cursor.getInt(3);
							jogos.add(s);  
						}
						else break;
					}
					i++;
				}while(cursor.moveToNext());
			}
		}
		catch(Exception ex)
		{
		}
		finally
		{
			cursor.close();
			this.bd.close();
		}
		return jogos;
	}
	
	public boolean salvarJogo(Jogo jogo){
		this.bd = this.context.openOrCreateDatabase(RepositorioJogo.BANCO, Context.MODE_PRIVATE, null);
		Cursor cursor = null;
		try{
			//Insere no banco de dados os valores principais do jogo
			int id_jogo;
			int size;
			List<Imagem> listImagens;
			List<String> insertImagem=new Vector<String>();
			String sql= "INSERT INTO jogo(tempo, dificuldade, jogador,status)"+
			"VALUES("+jogo.getTempo()+","+jogo.getDificuldade()+",'"+jogo.getJogador()+"','"+jogo.getStatus()+"');";
			
			this.bd.execSQL(sql);
			//recupera o ultimo jogo
			sql="SELECT id_jogo FROM jogo WHERE status='"+Jogo.STATUS_INACABADO+"' AND id_jogo=(SELECT MAX(id_jogo) FROM jogo);";
			cursor=this.bd.rawQuery(sql, null);
			cursor.moveToFirst();
			//salva as imagens do jogo
			id_jogo=cursor.getInt(0);
			cursor.close();
			listImagens=jogo.getListImagens();
			size=listImagens.size();
			//Insere no banco de dados os id das imagens e sua respectivas posi��es
			for (int i=0;i<size;i++){
				insertImagem.add( "INSERT INTO imagem(id_recurso, id_jogo, aberta)"+
						"VALUES("+listImagens.get(i).getIdRecurso()+","+id_jogo+",'"+Boolean.toString(listImagens.get(i).isAberta())+"');");
			}
			//Executa a Instru��o SQL das Imagens
		
			for (int i=0;i<size;i++){
				this.bd.execSQL(insertImagem.get(i));
			}
			return true;
		}
		catch (Exception e) {
			return false;
		}
		finally{
			cursor.close();
			this.bd.close();
		}
	}
	
	
	public Jogo pegarUltimoJogoAberto(){
		Jogo jogo=null;
		Cursor cursor = null;
		int id_jogo=0;
		int dificuldade=0;
		int tempo = 0;
		String status = null;
		String jogador=null;
		String sql;
		Imagem imagem;
		List<Imagem> listImagens= new Vector<Imagem>();
		this.bd = this.context.openOrCreateDatabase(RepositorioJogo.BANCO, Context.MODE_PRIVATE, null);
		try{
			//seleciona o ultimo jogo aberto
			sql="SELECT * FROM jogo WHERE status='"+Jogo.STATUS_INACABADO+"' AND id_jogo=(SELECT MAX(id_jogo) FROM jogo);";
			cursor=this.bd.rawQuery(sql, null);
			cursor.moveToFirst();
			//salva as imagens do jogo
			id_jogo=cursor.getInt(0);
			tempo=cursor.getInt(1);
			dificuldade=cursor.getInt(2);
			jogador=cursor.getString(3);
			status=cursor.getString(4);
			cursor.close();
			//pega as imagens do jogo
			sql="SELECT * FROM imagem WHERE id_jogo="+id_jogo;
			cursor=this.bd.rawQuery(sql, null);
			//popula a lista
			if(cursor.moveToFirst()){
				do{
					imagem= new Imagem(cursor.getInt(1),Boolean.valueOf(cursor.getString(3)));
					listImagens.add(imagem);
				}while(cursor.moveToNext());
			}
			cursor.close();
		}catch(Exception e){
			
		}
		finally
		{
			cursor.close();
			this.bd.close();
			jogo= new Jogo();
			jogo.setJogador(jogador);
			jogo.setTempo(tempo);
			jogo.setStatus(status);
			jogo.setDificuldade(dificuldade);
			jogo.setListImagens(listImagens);
			return jogo;
		}
	}
	
}
